package com.xxl.job.admin.config;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

import java.util.Properties;

@Component
@Profile("local")
@Slf4j
public class SshConfiguration {

    //ssh连接的用户名
    @Value("${ssh.config.ssh-user}")
    private String sshUser;
    
    //ssh远程连接的ip地址
    @Value("${ssh.config.ssh-remote-server}")
    private String sshRemoteServer;//服务器ip
    
    //ssh连接的端口号，一般默认为22
    @Value("${ssh.config.ssh-remote-port}")
    private Integer sshRemotePort;

    //SSH使用密码
    @Value("${ssh.config.ssh-password}")
    private String sshPassword;
    
    @Value("${ssh.config.mysql-remote-server}")
    private String mysqlRemoteServer;//本机就行
    
    //本地数据库连接时用的端口号(不能填3306)
    @Value("${ssh.config.mysql-local-port}")
    private Integer mysqlLocalPort;//本机虚拟mysql端口(并不是本机的mysql
    
    //远程数据库端口用的端口号
    @Value("${ssh.config.mysql-remote-port}")
    private Integer mysqlRemotePort;//转发到服务器的端口(需要去服务器的vim /etc/my.cnf那里改端口 port=3876


    private Session session_mysql;//mysql

    /**
     * 关闭ssh连接
     */
    public void closeSSHMysql() {
        session_mysql.disconnect();
    }


    /**
     * 创建ssh连接
     */
    public void createSSH() throws JSchException {
        JSch jSch = new JSch();
        session_mysql = jSch.getSession(sshUser, sshRemoteServer, sshRemotePort);//mysql
        session_mysql.setPassword(sshPassword);

        //设置连接过程不校验known_hosts文件中的信息
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session_mysql.setConfig(config);

        //ssh 建立连接！
        session_mysql.connect();//mysql
        //根据安全策略，您必须通过转发端口进行连接
        session_mysql.setPortForwardingL(mysqlLocalPort, mysqlRemoteServer, mysqlRemotePort);//localhost:3670->服务器ip:3876
        // 保持SSH隧道活跃，定期发送数据或其他方式维持连接
        while (true) {
            try {
                //log.info("心跳检查线程休眠60S");
                Thread.sleep(60 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (!session_mysql.isConnected()) {
                log.warn("session_mysql连接失效，尝试恢复连接");
                try {
                    session_mysql.connect();
                    log.info("session_mysql尝试恢复连接成功");
                } catch (JSchException e) {
                    log.error("session_mysql尝试恢复连接失败！！！，建议重启服务");
                }
            }
            try {
                //log.info("发送session_mysql心跳");
                session_mysql.sendKeepAliveMsg();
            } catch (Exception e) {
                log.error("session_mysql心跳错误，需要重连");
                e.printStackTrace();
            }
        }
    }

}